#ifndef ROBOT_STATUS_CLIENT_H
#define ROBOT_STATUS_CLIENT_H

#include <QObject>
#include <memory>
#include <map>
#include "rclcpp/rclcpp.hpp"
#include "rms_pkg/srv/robot_status.hpp"

// 前向声明
class MapDownloadActionClient;

class RobotStatusClient : public QObject, public rclcpp::Node
{
    Q_OBJECT

public:
    explicit RobotStatusClient(QObject *parent = nullptr);
    ~RobotStatusClient();

    // 查询各种状态的公共方法，现在都带robotId参数
    Q_INVOKABLE void queryAll(const QString& robotId);
    Q_INVOKABLE void queryPosition(const QString& robotId);
    Q_INVOKABLE void queryBattery(const QString& robotId);
    Q_INVOKABLE void queryNavigationState(const QString& robotId);
    Q_INVOKABLE void queryMapName(const QString& robotId);
    
    // 设置地图下载客户端
    void setMapDownloadClient(std::shared_ptr<MapDownloadActionClient> client);
    
    // 同步查询方法（阻塞直到获取结果）
    Q_INVOKABLE QString getCurrentMapName(const QString& robotId);
    Q_INVOKABLE void checkAndDownloadMap(const QString &robotId);
    Q_INVOKABLE bool isFileExists(const QString &filePath);
    Q_INVOKABLE void downloadMap(const QString &robotId, const QString &mapName);

signals:
    void positionUpdated(float x, float y, float angle);
    void batteryUpdated(int battery);
    void navigationStateChanged(const QString& state, const QString& target);
    void mapNameUpdated(const QString& mapName);
    void queryFailed(const QString& error);
    void mapDownloadRequested(const QString& robotId, const QString& mapName);

private:
    std::map<std::string, rclcpp::Client<rms_pkg::srv::RobotStatus>::SharedPtr> clients_;
    std::shared_ptr<MapDownloadActionClient> mapDownloadClient_;

    void sendRequest(const QString& robotId, int queryType);
    void handleResponse(rclcpp::Client<rms_pkg::srv::RobotStatus>::SharedFuture future, int queryType);

};
#endif // ROBOT_STATUS_CLIENT_H